import { registerDecorator, ValidationArguments, ValidationOptions, ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator';

//正则验证密码格式
@ValidatorConstraint({ async: false })
export class ValidatePasswordFormatConstraint implements ValidatorConstraintInterface {
  validate(password: string) {
    let regex = /(?=.*[0-9])(?=.*[a-z])(?=.*[!@#$%&~]).{6,16}/;
    return regex.test(password)
  }
  defaultMessage(validationArguments?: ValidationArguments): string {
      return '密码格式错误，应为6-16位字符（英文/数字/!@#$%&~）三种组合';
  }
}
/**
 * 密码格式验证装饰器
 * 
 * 该装饰器用于验证密码是否符合指定的格式要求
 * 它通过注册一个装饰器来实现对目标对象属性的验证
 * 
 * @param {ValidationOptions} [validationOptions] - 可选的验证选项，用于自定义验证行为
 * @returns {Function} 返回一个装饰器函数，用于应用到目标对象的指定属性上
 */
export function IsPasswordFormat(validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      target: object.constructor,
      propertyName: propertyName,
      options: validationOptions,
      constraints: [],
      validator: ValidatePasswordFormatConstraint,
    });
  };
}

/**
 * 验证手机号格式的装饰器
 * 
 * 该装饰器用于验证一个属性是否符合中国大陆手机号的格式它通过正则表达式来检查属性值
 * 主要用于实体类属性的验证，以确保数据的正确性
 * 
 * @param {ValidationOptions} [validationOptions] - 可选的验证选项，用于自定义验证行为
 * @returns {Function} 返回一个装饰器函数，用于应用到目标对象的指定属性上
 */
export function IsPhoneFormat(validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      target: object.constructor,
      propertyName: propertyName,
      options: validationOptions,
      constraints: [],
      validator: {
        /**
         * 执行手机号格式验证的函数
         * 
         * 使用正则表达式来检查传入的值是否符合中国大陆手机号的格式
         * 
         * @param {any} value - 待验证的属性值
         * @param {ValidationArguments} args - 验证参数，包括当前验证规则、对象等信息
         * @returns {boolean} 返回验证结果，true表示验证通过，false表示验证失败
         */
        validate(value: any, args: ValidationArguments) {
          let regex = /^1[3-9]{1}[0-9]{9}$/;
          let r = regex.test(value)
          return r
        },
        defaultMessage(validationArguments?: ValidationArguments): string {
          return '邮箱格式错误';
      }
      },
    });
  };
}
/**
 * 验证属性值是否符合邮箱格式的装饰器工厂函数
 * @param validationOptions 验证选项配置对象，可选参数
 * @returns 返回一个属性装饰器函数
 */
export function IsEmailFormat(validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    // 注册自定义验证装饰器
    registerDecorator({
      target: object.constructor,
      propertyName: propertyName,
      options: validationOptions,
      constraints: [],
      validator: {
        /**
         * 执行邮箱格式验证的核心逻辑
         * @param value 待验证的属性值
         * @param args 验证参数对象
         * @returns 返回布尔值表示验证是否通过
         */
        validate(value: any, args: ValidationArguments) {
          // 定义邮箱格式的正则表达式
          let regex = /^([a-zA-Z0-9_.&-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/;
          // 执行正则匹配验证
          let r = regex.test(value)
          return r
        },
      },
    });
  };
}


